package com.chen.aicodeplatform.exception;

import com.chen.aicodeplatform.common.BaseResponse;
import com.chen.aicodeplatform.common.ResultUtils;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Author: coder钰
 * @Date: 2025-08-22-23:51
 * @Version: 1.0
 * @Description: 全局异常处理器
 * <p>
 * 注意：由于本项目使用的 Spring Boot 版本 >= 3.4、并且是 OpenAPI 3 版本的 Knife4j，这会导致 @RestControllerAdvice 注解不兼容，
 * 所以必须给这个类加上 @Hidden 注解，不被 Swagger加载。虽然网上也有其他的解决方案，但这种方法是最直接有效的。
 */
@Hidden
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    public BaseResponse<?> businessExceptionHandler(BusinessException e) {
        log.error("BusinessException", e);
        return ResultUtils.error(e.getCode(), e.getMessage());
    }

    /**
     * 处理数据库 唯一键重复错误
     *
     * @param e
     * @return
     */
    @ExceptionHandler(DuplicateKeyException.class)
    public BaseResponse<?> duplicateKeyExceptionHandler(DuplicateKeyException e) {
        log.error("DuplicateKeyException", e);
        // 获取到重复key
        String message = e.getMessage().substring(e.getMessage().lastIndexOf(":") + 1).trim();
        // 正则表达式匹配 '...' 中的内容
        Pattern pattern = Pattern.compile("Duplicate entry '([^']+)'");
        Matcher matcher = pattern.matcher(message);

        if (matcher.find()) {
            message = "已存在 " + matcher.group(1) + ", 请勿重复添加";
        }
        return ResultUtils.error(ErrorCode.OPERATION_ERROR, message);
    }

    @ExceptionHandler(RuntimeException.class)
    public BaseResponse<?> runtimeExceptionHandler(RuntimeException e) {
        log.error("RuntimeException", e);
        return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统错误");
    }
}
